<?php
/**
 * Created by PhpStorm.
 * User: lenovo
 * Date: 2020/6/15
 * Time: 15:49
 */

namespace App\HttpController\V1;


use App\Logic\UserLogic;
use App\Services\BroadcastService;
use App\Services\HelpService;
use App\Services\ReponseCodeService;
use App\Services\UserService;
use EasySwoole\Http\Message\Status;
use EasySwoole\Validate\Validate;

class User extends ApiController
{
    /**
     * showdoc
     * @catalog 开放平台
     * @title  登录
     * @description 登录，生成用户在系统的唯一身份标识 Token，各端 SDK 使用 token 连接即时通讯服务器，终端用户在使用即时通讯能力前必须获取 token。
     * @method  POST
     * @url /v1/user
     * @param  nonce  是 string 消息随机字符串，由时间戳+6位随机字符串，用于消息校验,提交之前请加密
     * @param  content  是 string 除了timestamp，nonce,content,sign这是4参数，其他参数都是包裹在content，并进行aes加密
     * @param  timestamp  是 string 时间戳
     * @param  sign  是 string 签名，生成规则$content.$timestamp.$nonce，注意，这时候的nonce没有加密
     * @param  access_key 是 string 应用access_key
     * @param app_user_id 是  string  用户唯一标识，支持大小写英文字母、数字、部分特殊符号 + | = - _ 的组合方式，最大长度 64 字节。
     * @param nickname  是  string  用户昵称，最大长度 128 字节。用来在 Push 推送时显示用户的名称。
     * @param head  是 string 用户头像，请给完整地址，如http://rongcloud.cn/portrait.jpg
     * @return_param  code int 状态码(200:成功0:失败400:参数错误)
     * @return_param  id string 用户唯一标识，请对人方存储起来，后续客户端会用到
     * @return_param  token string 用户登录用的token
     * @remark 下发的数据也是加密的，请不要再客户端请求，否则秘钥可能泄露。用户不存在会自动创建，已经创建的用户会自动替换昵称、头像。
     */
    public function Login(){
        $param =  $this->param;
        $valitor = new Validate();
        $valitor->addColumn('app_user_id', '用户id')->required('用户唯一标识必须传')->between(0,64,'id超长');
        $valitor->addColumn('nickname', '昵称')->required('用户昵称必须传')->between(0,64,'昵称太长啦');
        $valitor->addColumn('head', '用户头像')->required('用户头像必须传')->between(0,255,'头像网址太长');

        $bool = $valitor->validate($param);
        if (!$bool) {
            return $this->writeJson(Status::CODE_BAD_REQUEST,  HelpService::aesEncrypt(json_encode(array()),$this->app['access_key'],$this->app['secret_key']), $valitor->getError()->__toString());
        }

        $userService = new UserService();
        $loginInfo = $userService->loginByAppUserId($param['app_user_id'],$param['head'],$param['nickname'],$this->app['id']);
        if($loginInfo == false){
            return $this->writeJson(Status::CODE_SERVICE_UNAVAILABLE, HelpService::aesEncrypt(json_encode(array()),$this->app['access_key'],$this->app['secret_key']), '登录失败');
        }

        $returnData['token'] = $loginInfo['token'];
        $returnData['id'] = $loginInfo['id'];
        return  $this->writeJson(Status::CODE_OK,  HelpService::aesEncrypt(json_encode( $returnData),$this->app['access_key'],$this->app['secret_key']), "注册成功");
    }

    /**
     * showdoc
     * @catalog 开放平台
     * @title  更新用户信息
     * @description
     * @method  PUT
     * @url /v1/user
     * @param  nonce  是 string 消息随机字符串，由时间戳+6位随机字符串，用于消息校验,提交之前请加密
     * @param  content  是 string 除了timestamp，nonce,content,sign这是4参数，其他参数都是包裹在content，并进行aes加密
     * @param  timestamp  是 string 时间戳
     * @param  sign  是 string 签名，生成规则$content.$timestamp.$nonce，注意，这时候的nonce没有加密
     * @param  access_key 是 string 应用access_key
     * @param id 是  string  用户唯一标识，是登录、注册后回传的用户id，注意，这是平台的用户id。
     * @param nickname  否  string  用户昵称，有变动才需要传，最大长度 128 字节。用来在 Push 推送时显示用户的名称。
     * @param head  否 string 用户头像，有变动才需要传，请给完整地址，如http://rongcloud.cn/portrait.jpg
     * @return_param  code int 状态码(200:成功0:失败400:参数错误，503数据库挂了之类的，服务不可用)
     * @remark 修改用户头像、昵称，请有变动才修改，不变动无需修改。
     */
    public function update(){
        $param =  $this->param;
        $valitor = new Validate();
        $valitor->addColumn('id', '用户id')->required('用户唯一标识必须传')->between(0,64,'id超长');
        $valitor->addColumn('nickname', '昵称')->between(0,64,'昵称太长啦');
        $valitor->addColumn('head', '用户头像')->between(0,255,'头像网址太长');

        $bool = $valitor->validate($param);
        if (!$bool) {
            return $this->writeJson(Status::CODE_BAD_REQUEST,  HelpService::aesEncrypt(json_encode(array()),$this->app['access_key'],$this->app['secret_key']), $valitor->getError()->__toString());
        }

        //修改用户信息
        $updateInfo = array();
        if(isset($param['nickname'])){
            $updateInfo['nickname'] = $param['nickname'];
        }

        if(isset($param['head'])){
            $updateInfo['head'] = $param['head'];
        }

        if(count($updateInfo)<=0){
            return $this->writeJson(ReponseCodeService::CODE_BAD_REQUEST,  HelpService::aesEncrypt(json_encode(array()),$this->app['access_key'],$this->app['secret_key']), $valitor->getError()->__toString());
        }

        $userLogic = new UserLogic();
        $updateRet = $userLogic->updateInfo($param['id'],$updateInfo);
        if( $updateRet==true){
            //广播更新动态信息
            $broadcastService = new BroadcastService();
            $updateData['nickname'] = $param['nickname'];
            $updateData['head'] = $param['head'];
            $updateData['id'] = $param['id'];
            $updateData['app_id'] = $param['app_id']->$this->app['id'];
            $broadcastService->accountChange($updateData,$param['id']);
            return  $this->writeJson(ReponseCodeService::CODE_OK,  HelpService::aesEncrypt(json_encode( array()),$this->app['access_key'],$this->app['secret_key']), "更新成功");
        }

        return  $this->writeJson( ReponseCodeService::CODE_SERVICE_UNAVAILABLE,  HelpService::aesEncrypt(json_encode( array()),$this->app['access_key'],$this->app['secret_key']), "更新失败");
    }
}